
package net.sea.setup.action.ext.impl;

import java.io.File;
import java.sql.Connection;
import java.util.List;
import java.util.Map;

import net.sea.commons.constants.AppConstants;
import net.sea.commons.context.AppContext;
import net.sea.commons.util.DBUtils;
import net.sea.commons.util.ELUtils;
import net.sea.commons.util.ELUtils.EL;
import net.sea.commons.util.InstallMsgUtils;
import net.sea.commons.util.StringUtils;
import net.sea.setup.action.AbstractAction;
import net.sea.setup.action.constants.Constants;

/**
 * 数据库初始化的处理类
 *
 * @author huachengwu 
 */
public class DBInitAction extends AbstractAction {

	/*
	 * 数据库初始化的安装方法
	 * 
	 * @see
	 * com.ec.setup.action.IAction#install(net.sea.commons.context.AppContext,
	 * java.util.Map)
	 */
	@Override
	public void install(AppContext context, Map<String, String> parMap) {
		boolean dbInitFlag = context.getAttribute(AppConstants.DB_INIT_FLAG) == null ? false
				: (Boolean) context.getAttribute(AppConstants.DB_INIT_FLAG);
		if (dbInitFlag) {
			logger.info(parMap.get(Constants.INSTALL_DESC_KEY));
			InstallMsgUtils.setInstallMsg("初始化数据库");
			// 获取数据库配置信息
			long startTime = System.currentTimeMillis();
			String url = (String) context.getAttribute(AppConstants.DB_URL);
			if (logger.isDebugEnabled()) {
				logger.debug("数据库URL：" + url);
			}
			String user = (String) context.getAttribute(AppConstants.DB_USER);
			if (logger.isDebugEnabled()) {
				logger.debug("数据库用户名：" + user);
			}
			String password = (String) context
					.getAttribute(AppConstants.DB_PWD);
			if (logger.isDebugEnabled()) {
				logger.debug("数据库密码：" + password);
			}
			String driverClass = (String) context
					.getAttribute(AppConstants.DB_DRIVER_CLASS);
			if (logger.isDebugEnabled()) {
				logger.debug("数据库驱动类：" + driverClass);
			}
			String driverJar = (String) context
					.getAttribute(AppConstants.DB_DRIVER_JAR);
			if (logger.isDebugEnabled()) {
				logger.debug("数据库驱动jar包：" + driverJar);
			}

			try {
				// 连接数据库
				if (StringUtils.isEmpty(driverJar)) {
					throw new RuntimeException("数据库驱动jar包错误");
				}
				DBUtils.loadClass(driverJar.split(";"));
				Connection conn = DBUtils.getConnection(url, user, password,
						driverClass);

				// 获取数据库创建脚本
				String createFile = parMap.get("createFile");
				if (StringUtils.isNotEmpty(createFile)) {
					List<EL> els = ELUtils.getVarName(createFile);
					for (EL el : els) {
						String value = (String) context.getAttribute(el
								.getVarName());
						createFile = createFile.replace(el.getElExp(),
								value.replace("\\", "/"));
					}
					if (logger.isDebugEnabled()) {
						logger.debug("数据库对象创建脚本文件：：" + createFile);
					}
					// 执行数据库创建操作
					DBUtils.executeSQLScript(conn, new File(createFile));
				}

				// 获取数据库数据脚本
				String dataFile = parMap.get("dataFile");
				if (StringUtils.isNotEmpty(dataFile)) {
					List<EL> els = ELUtils.getVarName(dataFile);
					for (EL el : els) {
						String value = (String) context.getAttribute(el
								.getVarName());
						dataFile = dataFile.replace(el.getElExp(),
								value.replace("\\", "/"));
					}
					if (logger.isDebugEnabled()) {
						logger.debug("数据库数据文件：：" + dataFile);
					}
					// 执行数据库数据脚本
					DBUtils.executeSQLScript(conn, new File(dataFile));
				}

				// 关闭数据库连接
				DBUtils.close(conn);
			} catch (Exception e) {
				logger.error("数据初始化失败", e);
			}

			long endTime = System.currentTimeMillis();
			if (logger.isDebugEnabled()) {
				logger.debug("操作执行时间：" + (endTime - startTime) / 1000.0 + "秒");
			}
		}
	}

	/*
	 * 数据库初始化的卸载方法
	 * 
	 * @see
	 * com.ec.setup.action.IAction#uninstall(net.sea.commons.context.AppContext,
	 * java.util.Map)
	 */
	@Override
	public void uninstall(AppContext context, Map<String, String> parMap) {

	}

}

/*
 * 修改历史 $Log$
 */